package com.ruoyi.web.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Hashtable;

/**
 * 图片工具类
 *
 */
public class ImageUtil {
    /**
     * 检查颜色是否为 白色 或者 黑色阈值范围
     * @param rgb 颜色值
     * @param color 0:白色 1:黑色
     * @return 检查结果
     */
    private static boolean checkColor(int rgb,int offset,int color){
        int R = (rgb & 0xff0000) >> 16;
        int G = (rgb & 0xff00) >> 8;
        int B = (rgb & 0xff);
        if(color == 0){
            return ((255 - R) <= offset) && ((255 - G) <= offset) && ((255 - B) <= offset);
        }else{
            return ((R <= offset) && (G <= offset) && (B <= offset));
        }
    }

    /**
     * 设置源图片为背景透明，并设置透明度
     * @param imgByte 源图片
     * @param alpha 透明度
     * @param formatName 文件格式
     * @throws IOException
     */
    public static byte[] transparentImage(byte[] imgByte,int alpha,String formatName) throws IOException {
        ByteArrayInputStream in = new ByteArrayInputStream(imgByte);    //将b作为输入流；
        BufferedImage image = ImageIO.read(in);     //将in作为输入流，读取图片存入image中，而这里in可以为ByteArrayInputStream();
        return transparentImage(image, alpha, formatName);
    }
    /**
     * 设置源图片为背景透明，并设置透明度
     * @param srcImage 源图片
     * @param alpha 透明度
     * @param formatName 文件格式
     * @throws IOException IO异常
     **/
    public static byte[] transparentImage(BufferedImage srcImage, int alpha, String formatName) throws IOException {
        int imgHeight = srcImage.getHeight();//取得图片的长和宽
        int imgWidth = srcImage.getWidth();
        int c = srcImage.getRGB(3, 3);
        //防止越位
        if (alpha < 0) {
            alpha = 0;
        } else if (alpha > 10) {
            alpha = 10;
        }
        BufferedImage bi = new BufferedImage(imgWidth, imgHeight,
                BufferedImage.TYPE_4BYTE_ABGR);//新建一个类型支持透明的BufferedImage
        Graphics2D g = bi.createGraphics();
        for(int i = 0; i < imgWidth; ++i)//把原图片的内容复制到新的图片，同时把背景设为透明
        {
            for(int j = 0; j < imgHeight; ++j)
            {
                //把背景设为透明
                if(srcImage.getRGB(i, j) == c){
                    bi.setRGB(i, j, c & 0x00ffffff);
                }
                //设置透明度
                else{
                    int rgb = srcImage.getRGB(i, j);
                    rgb = ((alpha * 255 / 10) << 24) | (rgb & 0x00ffffff);
                    bi.setRGB(i, j, rgb);
                }
            }
        }
        g.dispose();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(bi,formatName,outputStream);
        return outputStream.toByteArray();
    }


    /**
     * 给图片添加单个文字水印、可设置水印文字旋转角度
     * @param source 需要添加水印的图片路径（如：F:/images/6.jpg）
     * @param color 水印文字的颜色
     * @param word 水印文字
     * @param degree 水印文字旋转角度，为null表示不旋转
     */
    public static byte[] markImageBySingleText(byte[] source, Color color, String word, Integer degree) throws IOException {
        //读取原图片信息
        InputStream imgInput = new ByteArrayInputStream(source);
        Image img = ImageIO.read(imgInput);
        int width = img.getWidth(null);
        int height = img.getHeight(null);
        //加水印
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = bi.createGraphics();
        g.drawImage(img, 0, 0, width, height, null);
        //根据图片的背景设置水印颜色
        g.setColor(color);
        if (null != degree) {
            //设置水印旋转
            g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);
        }
//        g.setFont(font);

        int x = 0;
        int y = height/2 - height/14;
        //水印位置
//        g.drawString(word, x, y);
        g.fillRect(x,y,width,height/7);
        g.dispose();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(bi,"gif",bos);
        return bos.toByteArray();
    }

}
